Snowflakeのストアドプロシージャを使ってPythonからSnowflakeへSQLクエリを投げてみた
みなさん、こんにちは。クルトンです!
今回はタイトル通り、ストアドプロシージャの中身をPythonコードで記述し、SnowflakeへSQLクエリを投げてみました。ストアドプロシージャは、Snowflakeの定期実行の機能であるTASKにおいても使用できるため、好きなSQLクエリを実行するために使えそうです。
という事で早速実装していきます。
やってみた
前準備
自分の環境ではすでにDBは用意していたので、スキーマから準備していきます。DBで気軽に使えそうなものがない場合は、新規のものをCREATE DATABASE
文を使って作成してから、以下のSQLを実行していってください。
-- 権限が不安な方は実行を簡単にするため強めの権限を持つロールを使用
USE ROLE ACCOUNTADMIN;
-- データベース指定
USE DATABASE <お使いのDB>; -- なければ新規作成してください
-- スキーマから準備
CREATE OR REPLACE SCHEMA test_procedure;
CREATE OR REPLACE TABLE test_procedure_table(col1 varchar(5));
INSERT INTO test_procedure.test_procedure_table VALUES
('test1'),('test2'), ('test3'), ('test4'), ('test5');
SELECT * FROM TEST_PROCEDURE.TEST_PROCEDURE_TABLE;
SQLを実行してみると、以下のように新規作成したテーブルからデータが取得できているかと思います。
ストアドプロシージャ作成と呼び出しまで
以下のSQLでストアドプロシージャを作成します。
CREATE OR REPLACE PROCEDURE TEST_PROCEDURE(
db_name string,
schema_name string,
table_name string
)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.11'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'main'
AS
$$
from snowflake.snowpark import Session
def main(db_name: str, schema_name: str, table_name: str):
connection_parameters = {
"account": "<your snowflake account>",
"user": "<your snowflake user>",
"password": "<your snowflake password>"
}
with Session.builder.configs(connection_parameters).create() as session:
query = f"SELECT * FROM {db_name}.{schema_name}.{table_name};"
data = session.sql(query).collect()
return data
$$
;
変数connection_parametersの中身をご自分の環境に合わせて書き換えてください。
アカウント名については、以下の画像のように、Snowsight(Snowflakeの画面上)の左下にアイコンがあるのでクリックすると確認できます。
次にストアドプロシージャを実行してみます。
-- ストアドプロシージャを呼び出す
CALL TEST_PROCEDURE('<お使いのDB名>', 'test_procedure', 'test_procedure_table');
表示の仕方は違うものの、SQLを実行した時と同じようにテーブルの値が取得できました!
後片付け
スキーマ配下に、テーブルとストアドプロシージャは存在するため、以下のSQLを実行すれば後片付け完了です。
DROP SCHEMA test_procedure;
終わりに
ここまでで、ストアドプロシージャを簡単に試してみました。
ちなみにPythonコード自体が間違っている場合は、以下のようにPythonコード上で何行目にエラーが出ているかなど、出力してくれるので便利です。
下記の画像では「今使っているPythonコード上でstringという型はないよ!」というエラーが出力されているため、「strと直したら良さそうだな」と分かります。
今回はここまで。それでは、また!
参考サイト